package produtos.DaoDB;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Collection;
import java.util.LinkedList;

import produtos.exceptions.ProdutoInvalidoException;
import produtos.produtos.Categoria;
import produtos.produtos.Produto;
import conexao.Conexao;

public class RepositorioProdutoDaoDB implements IRepositorioProdutoDAO{
	
	private Connection conn = null;
	
	public void inserirProdutos(Produto produto) throws ClassNotFoundException, SQLException {
		this.conn = Conexao.getConexao();
		
		PreparedStatement pstmt = this.conn.prepareStatement(
				"INSERT INTO produto (codproduto, nome, preco, quantidade, categoria, fornecedor, sabor, tamanho) " +
				"VALUES (upper(?), upper(?), ?, ?, upper(?), upper(?), upper(?), upper(?) );");
		
		pstmt.setString	(1, produto.getCodigo());
		pstmt.setString	(2, produto.getNomeProduto());
		pstmt.setFloat	(3, produto.getPreco());
		pstmt.setInt	(4, produto.getQuantidade());
		pstmt.setString	(5, produto.getCategoria().getNomeCategoria());
		pstmt.setString	(6, produto.getFornecedor().getNomeFornecedor());
		pstmt.setString	(7, produto.getSabor());
		pstmt.setString	(8, produto.getTamanho());
		
		pstmt.executeUpdate();
	}


	public Collection<Produto> localizarProdutos(String descricao) throws ClassNotFoundException, SQLException, ProdutoInvalidoException {
		this.conn = Conexao.getConexao();
		
		Collection<Produto> listaProdutoNome = new LinkedList<Produto>();
		
		PreparedStatement ps = conn.prepareStatement("SELECT * FROM produto WHERE nome = upper(?)");
		ps.setString(1, descricao);
				 
		ResultSet rs = ps.executeQuery();
		
		Produto produto = null;
		Categoria categoria = null;		
		
		while(rs.next()){
			produto = new Produto();
			categoria = new Categoria();
			
			produto.setCodigo(rs.getString("codproduto"));
			produto.setNomeProduto(rs.getString("nome"));
			produto.setPreco(rs.getFloat("preco"));
			produto.setQuantidade(rs.getInt("quantidade"));
			produto.setSabor(rs.getString("sabor"));
			produto.setTamanho(rs.getString("tamanho"));
			categoria.setNomeCategoria(rs.getString("categoria"));	
			produto.setCategoria(categoria);
					
			
			listaProdutoNome.add(produto);
		}		
		return listaProdutoNome;		
	}
	
	public Collection <Produto> listarProdutos() throws ClassNotFoundException, SQLException {		
		this.conn = Conexao.getConexao();
		Collection<Produto> listaProdutos = new LinkedList<Produto>();	
		Statement stmt = conn.createStatement();
		Produto novoProduto = null;
		Categoria novaCategoria = null;
		
		ResultSet rs = stmt.executeQuery
				("SELECT * FROM produto ");				
					
		while(rs.next()){
			novoProduto = new Produto();
			novaCategoria = new Categoria();
			
			novoProduto.setCodigo(rs.getString("codproduto"));
			novoProduto.setNomeProduto(rs.getString("nome"));
			novoProduto.setPreco(rs.getFloat("preco"));
			novoProduto.setQuantidade(rs.getInt("quantidade"));
			novoProduto.setSabor(rs.getString("sabor"));
			novoProduto.setTamanho(rs.getString("tamanho"));						
			novaCategoria.setNomeCategoria(rs.getString("categoria"));	
			novoProduto.setCategoria(novaCategoria);
			
			listaProdutos.add(novoProduto);
		}

		return listaProdutos;
	}
	
	public boolean isExiste(String descricao) throws ClassNotFoundException, SQLException{
		this.conn = Conexao.getConexao();		
		boolean existe = false;
		
	       PreparedStatement psmt = conn.prepareStatement
	    		   ("SELECT nome FROM produto WHERE nome = upper(?)");  
	            psmt.setString(1, descricao);   
	            ResultSet rs = psmt.executeQuery();  

	            if (rs.next()) {  
	                existe = true;  
	            }   
	            return existe;   
	}  
	            
	public void excluirProduto(String descricao) throws ClassNotFoundException, SQLException{
		this.conn = Conexao.getConexao();
		
			PreparedStatement ps = conn.prepareStatement
					("DELETE FROM produto WHERE nome = ?");
			ps.setString(1, descricao.toUpperCase());
			ps.executeUpdate();
		}


	public void alterarProduto(String descricao, String novaDescricao, float preco, int quantidade) throws SQLException, ClassNotFoundException {
		this.conn = Conexao.getConexao();		

		PreparedStatement pstmt = this.conn.prepareStatement
				("UPDATE produto SET nome = upper(?), preco = ?, quantidade = ? WHERE nome = upper(?)");
		pstmt.setString(1, novaDescricao);
		pstmt.setFloat(2, preco);
		pstmt.setInt(3, quantidade);
		pstmt.setString(4, descricao);
		
		pstmt.executeUpdate();
		}
			
	public Collection <Categoria> listarCategorias() throws ClassNotFoundException, SQLException {		
		this.conn = Conexao.getConexao();
		Collection<Categoria> listaCategorias = new LinkedList<Categoria>();	
		Statement stmt = conn.createStatement();
		Categoria novaCategoria = null;
		
		ResultSet rs = stmt.executeQuery
				("SELECT * FROM categoria ");				
					
		while(rs.next()){
			novaCategoria = new Categoria();
			novaCategoria.setCodCategoria(rs.getInt("codcategoria"));
			novaCategoria.setNomeCategoria(rs.getString("nomecategoria"));
	
			listaCategorias.add(novaCategoria);
		}
	
		return listaCategorias;
	}
}
